﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //基础语法
            //Test1();
            //Test2();
            //Test3();
            //Test4();
            //Test5();
            //Test6();
            //Test7();
            //Test8();
            //Test9();
            //Test10();
            //Test11();
            //Test12();
            //Test13();
            //Test14();
            //Test15();
            //Test16();
            //Test17();
            //Test18();

            //字符串常用的重要方法 
            //Test19();
            //Test20();
            //Test21();
            //Test22();
            //Test23();
            //Test24();
            //Test25();
            //Test26();
            //Test27();
            //Test28();
            //Test29();
            //Test30();

            //常量枚举
            //Test31();
            //Test32();
            Console.ReadLine();
        }
        //基础语法
        #region  Write和WriteLine方法的对比
        static void Test1()
        {
            Console.Write("请输入学员姓名："); //这个是单独的一行，不回车换行
            Console.WriteLine("请输入学员姓名："); //回车换行
        }
        #endregion 
        #region 字符串拼接
        static void Test2()
        {
            Console.WriteLine("请输入学员姓名：");
            string name = Console.ReadLine();

            Console.WriteLine("请输入学员成绩：");
            int score = int.Parse(Console.ReadLine());

            Console.WriteLine("姓名:" + name + "成绩:" + score);
        }
        #endregion 
        #region 字符串格式化方法
        static void Test3()
        {
            Console.Write("请输入学员姓名：");
            string name = Console.ReadLine();

            Console.Write("请输入学员成绩：");
            int score = int.Parse(Console.ReadLine());

            Console.Write("请输入学员班级：");
            string className = Console.ReadLine();

            //普通拼接
            string result = "姓名：" + name + "成绩" + score + "班级" + className;
            Console.WriteLine(result);
            //格式化方法1
            string result1 = string.Format("姓名:{0} 成绩:{1} 班级:{2}", name, score, className);
            Console.WriteLine(result1);
            //格式化方法2(简化)
            string result2 = $"姓名：{name} 成绩：{score} 班级：{className}";
            Console.WriteLine(result2);
        }
        #endregion
        #region 算术运算符
        static void Test4()
        {
            int a = 10; // = 其实是赋值运算符
            int b = 20;
            int result = a + b;
            Console.WriteLine($"a+b={result}");
        }
        #endregion
        #region 比较运算符
        static void Test5()
        {
            string name1 = "james";
            string name2 = "jacks";
            string name3 = "james";
            bool result1 = name1.Equals(name2);
            Console.WriteLine(result1);
            /* bool result2 = name1.Equals(name3);
             Console.WriteLine(result2);*/
            Console.WriteLine(name1 == name2);
            Console.WriteLine(name1==name3);
        }
        #endregion
        #region 值类型转换（自动类型转换）
        static void Test6()
        {
            double a = 100.55;
            int b = 6;
            double result = a + b;
            Console.WriteLine("自动类型转换结果：a + b =" + result);
        }
        #endregion
        #region 值类型转换（强制类型转换）
        static void Test7()
        {
            double a = 100.55;
            int b = 6;
            int result = (int)a + b; //如果目标类型函数<使用的数据类型，会全部舍掉小数(精度丢失)
            Console.WriteLine("自动类型转换结果：a + b =" + result);

            object c = 100.5;
            int d = 300;
            int result1 = (int)(double)c + d; //object属于引用类型
            Console.WriteLine("自动类型转换结果：a + b =" + result1);
        }
        #endregion
        #region 强制类型转换：字符串和值类型之间
        static void Test8()
        {
            //"100.5"数字类型的字符串==>目标类型的"有效表示形式"
            double a = double.Parse("100.5");
            float b = float.Parse("20.26");
            int c = int.Parse("20");
            Console.WriteLine($"{a} {b} {c}");
            int d = (int)double.Parse("19.6");
            Console.WriteLine(d);
            string s1 = a.ToString();
            string s2 = b.ToString();
            Console.WriteLine(s1 + " " + s2);
        }
        #endregion
        #region 强制类型转换:万能转换器:Convert
        static void Test9()
        {
            double a = Convert.ToDouble("100.6");
            float b = Convert.ToSingle("20.24");
            int c = Convert.ToInt32(a);
            DateTime dt = Convert.ToDateTime("2022-12-31");
            DateTime dt1 = DateTime.Parse("2022-12-12");

            Console.WriteLine($"{a} {b} {c} {dt} {dt.ToShortDateString()} {dt1} {dt1.ToShortDateString()}");
        }
        #endregion
        #region if条件选择和逻辑运算符
        static void Test10()
        {
            Console.WriteLine("请输入用户姓名:");
            string uName = Console.ReadLine();
            Console.WriteLine("请输入用户密码:");
            string uPwd = Console.ReadLine();
            Console.WriteLine("您是管理员吗？");
            bool isAdmin = Convert.ToBoolean(Console.ReadLine());
            if(uName == "" || uPwd == "")
            {
                Console.WriteLine("用户名和密码必须都要填写");
                return; //表示无条件跳出方法，后面的代码都不执行
            }
            /*if(uName == "")
            {
                Console.WriteLine("【0】用户名不能为空");
            }*/
            if (uName == string.Empty)
            {
                Console.WriteLine("【1】用户名不能为空");
            }
            /*if(uName.Length == 0)
            {
                Console.WriteLine("【2】用户名不能为空");
            }*/
            if(uName == "thinger" && uPwd == "123")
            {
                Console.WriteLine("用户登录成功");
            }
            if(!isAdmin)
            {
                Console.WriteLine("当前用户不是管理员");
            }
        }
        #endregion
        #region 复杂if与运算符优先级
        static void Test11()
        {
            Console.WriteLine("请输入笔试成绩：");
            int writScore = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("请输入机试成绩：");
            int labScore = int.Parse(Console.ReadLine());
            if(writScore >= 80 && labScore >= 90)
            {
                Console.WriteLine("成绩优秀");
                return;
            }
            if((writScore == 100 && labScore >60) || (labScore == 100 && writScore > 60))
            {
                Console.WriteLine("成绩合格");

            }
        }
        #endregion
        #region if-else 条件选择与三元运算符
        static void Test12()
        {
            Console.WriteLine("请输入笔试成绩：");
            int writScore = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("请输入机试成绩：");
            int labScore = int.Parse(Console.ReadLine());
            string result = string.Empty;
            /*if(writScore > labScore)
            {
                result = "请加强机试练习";
            }
            else
            {
                result = "请加强笔试练习";
            }
            Console.WriteLine(result);
            Console.WriteLine("===================");*/
            result = writScore > labScore ? "请加强机试练习" : "请加强笔试练习";
            Console.WriteLine(result);

            int a = 10;
            int b = 20;
            int c = a - b > 0 ? a * b : a + b;
            Console.WriteLine(c);
        }
        #endregion
        #region 多条件选择if elseif与选择嵌套
        static void Test13()
        {
            Console.WriteLine("请输入客户消费金额：");
            int totalMoney = int.Parse(Console.ReadLine());
            if(totalMoney >= 100 && totalMoney < 200)
            {
                Console.WriteLine("需付费：" + totalMoney * 0.8);
            }
            else if (totalMoney >= 200 && totalMoney < 300)
            {
                Console.WriteLine("需付费：" + totalMoney * 0.7);
            }
            else if (totalMoney >= 300 && totalMoney < 400)
            {
                Console.WriteLine("需付费：" + totalMoney * 0.6);
            }
            else
            {
                Console.WriteLine("需付费：" + totalMoney * 0.5);
            }
        }
        #endregion
        #region switch分支结构
        static void Test14()
        {
            Console.WriteLine("请输入你购买的课程类型：");
            string type = Console.ReadLine();
            switch(type)
            {
                case "A":
                    Console.WriteLine("可以抽安卓手机");
                    break;
                case "B":
                    Console.WriteLine("可以抽平板电脑");
                    break;
                case "C":
                    Console.WriteLine("可以抽固态硬盘");
                    break;
                default:
                    Console.WriteLine("你不能参与抽奖");
                    break;

            }
        }
        #endregion
        #region for循环
        static void Test15()
        {
            /*for(int i = 0; i < 5; i++)
            {
                Console.WriteLine($"这是我的第{i+1}次做项目");
            }*/

            //显示3次比较准确的温度！ (条件：每一次需要采集3次)
            Console.Write("请输入要显示的温度次数：");
            int count = int.Parse(Console.ReadLine());
            for(int a = 1; a <= count; a++) // 循环外层：控制3次温度显示
            {
                double t_sum = 0; // 用来累次温度
                for(int b = 0; b < 3; b++) // 内循环：控制3次数据采集
                {
                    Console.Write($"请输入第[{b + 1}]次温度值：");
                    t_sum += double.Parse(Console.ReadLine());
                    if(b == 2)
                    {
                        double t_avg = t_sum / 3;
                        Console.WriteLine($"--------第[{a}]次温度采集结果是：{t_avg}度");
                    }
                }
            }
        }
        #endregion
        #region while循环
        static void Test16()
        {
            for(int i = 0; i < 3; i++)
            {
                int count = 0;
                while(count < 6)
                {
                    Console.WriteLine("当前产品是否合格？");
                    string result = Console.ReadLine();
                    if(result == "y" || result == "1")
                    {
                        Console.WriteLine("-放入箱中-");
                        count++;
                    }
                    else
                    {
                        Console.WriteLine("当前产品不合格");
                    }
                }
                Console.WriteLine($"------第{i+1}箱打包完成");
            }
        }
        #endregion
        #region 不固定循环次数
        static void Test17()
        {
            int sum = 0; //用来保存已经打包的次数
            while(true) //外层循环：控制箱数(不固定)
            {
                int count = 0;
                while(count < 6) //内层循环，控制每层包装的瓶数
                {
                    Console.WriteLine("当前产品是否合格");
                    string result = Console.ReadLine();
                    /*if(result == "y" || result == "1")
                    {
                        Console.WriteLine("放入箱中");
                        count++; // 计数累计(循环条件的改变)
                    }
                    else
                    {
                        Console.WriteLine("剔除当前不合格产品");
                    }*/
                    if(result != "y" && result != "1")
                    {
                        Console.WriteLine("剔除当前不合格产品");
                        continue;
                    }
                    Console.WriteLine("放入箱中");
                    count++; // 计数累计(循环条件的改变)
                }
                sum++;
                Console.WriteLine($"第{sum}箱打包完成");
                //需要条件判断，控制循环跳出
                Console.Write("还继续打包吗？ y/n");
                if(Console.ReadLine() == "n")
                {
                    Console.WriteLine("打包完成");
                    break; //退出整个循环
                }
            }
          /*  对比break和continue
                （1）break可用于switch结构和循环结构中；
                     continue只能用于循环结构中
                （2）break语句终止某个循环，程序跳转到循环块外的下一条语句；
                    continue跳出本次循环，进入下一次循环*/
        }
        #endregion
        #region do-while循环-不固定次数的循环
        static void Test18()
        {
            do
            {
                Console.WriteLine("当前网络返回的数据是：");
                if(Console.ReadLine()=="1")
                {
                    Console.WriteLine("网络测试成功");
                    break;
                }
            }while(true);
        }
        #endregion

        //字符串常用的重要方法  
        #region index()方法和Length属性
        static void Test19()
        {
            string email = "thinger@qq.com";
            int index1 = email.IndexOf("@"); //获取符合字符串条件的第一个索引的位置
            int index2 = email.IndexOf("qq.com");
            int index3 = email.IndexOf("qq.net"); //会返回-1 表示没找到
            Console.WriteLine($"{index1} {index2} {index3}");

            int length = email.Length; //获取字符串的长度
            Console.WriteLine("当前字符串的长度：" + length);
        }
        #endregion
        #region 字符串截取Substring()方法
        static void Test20()
        {
            string email = "thinger@qq.com";
            string userName = email.Substring(0, email.IndexOf("@"));
            Console.WriteLine(userName);
            //如果我们希望得到某一个字符串后面的全部内容，截取的位置是这个字符串的索引位置+1
            string type = email.Substring(email.IndexOf("@")+1);
            Console.WriteLine(type);
        }
        #endregion
        #region 字符串的比较
        static void Test21()
        {
            string name1 = "jack";
            string name2 = "jack";
            string name3 = "james";
            string name4 = "JAMES";
            string name5 = "JAMES";
            //比较运算符
            Console.WriteLine(name1 == name2);
            Console.WriteLine("name1 == name2 " + name1==name2);
            Console.WriteLine("name1 == name2 " + (name1 == name2));

            Console.WriteLine("name1==name2 {0}", name1 == name2);
            Console.WriteLine("name1==name3 {0}", name1 == name3);
            Console.WriteLine("name3==name4 {0}", name3 == name4);

            //如果我们比较字符串，忽略大小写，只需同时转换成大写，或者小写即可
            Console.WriteLine("name3==name4 "+(name3.ToLower() == name4.ToLower()));
            Console.WriteLine("name3 == name4 " +name3.Equals(name4));
            Console.WriteLine("name4 == name5 " + name4.Equals(name5));
            // 5 + 3*3 = 14 

            //提醒： ==或Equals方法默认只能比较"值类型"或者"字符串"类型，对象类型（引用类型）是不能使用这种方法比较的
        }
        #endregion
        #region 字符串格式化和显示结果的扩展
        static void Test22()
        {
            string name = "Tom";
            int age = 20;
            Console.WriteLine("学员姓名：{0} 年龄：{1}", name,age);
            Console.WriteLine($"学员姓名：{name} 年龄：{age}");

            string info = string.Format("学员姓名：{0} 年龄：{1}", name, age);
            Console.WriteLine(info);

            int money = 255555;
            string moneyType = string.Format("总金额:{0:C2}", money);
            Console.WriteLine(moneyType);
            Console.WriteLine($"总金额:{money:C3}");

            //小数位数格式化
            double sum = 33.452653;
            Console.WriteLine(sum.ToString("0.00"));
            Console.WriteLine(sum.ToString("0.0000"));
        }
        #endregion
        #region 字符串空值的处理方法
        static void Test23()
        {
            string name1 = ""; //这个"空"字符串是占用空间的 （空值）
            string name2 = string.Empty; // 这个和上面是一样的
            Console.WriteLine(name1.Equals(name2));
            Console.WriteLine("name1的长度="+name1.Length);
            Console.WriteLine("name2的长度=" + name2.Length);

            string name3; //这个是没有赋值过程
            string name4 = null; //这个是存在一个赋值的过程 （空对象）
            Console.WriteLine(name4 == name1);
            //Console.WriteLine(name3 == name4); //这个会有语法错误
            //Console.WriteLine(name4.Equals(name1)); //空对象不能调用方法,针对null对象调用方法,会报错
            //解决问题：未将对象引用到对象的实例。 方法：首先找到哪个对象为null,然后往上推...

            //判断字符串为空值常见的优先级
            //name.Length == 0;
            //name == string.Empty;
            //name = "";
        }
        #endregion
        #region 字符串处理的其他方法
        static void Test24()
        {
            //字符串去空格
            string info = " jack ";
            Console.WriteLine(info.Length);

            //前后都去空格
            Console.WriteLine(info.Trim());
            Console.WriteLine(info.Trim().Length);

            string name3 = "james";
            string name4 = "JAMES";
            Console.WriteLine(name3.ToUpper());
            Console.WriteLine(name4.ToLower());

            Console.WriteLine(name3 == name4);
            Console.WriteLine(name3 == name4.ToLower());

            //获取符合字符串条件的最后一个索引位置
            string url = "abctest.123.qq.thinger.cn";
            Console.WriteLine(url.LastIndexOf("."));
        }
        #endregion
        #region 字符串的拼接
        //高校字符串的组合
        static void Test25()
        {
            StringBuilder builder1 = new StringBuilder(); //最后得到string类型必须调用这个方法
            builder1.Append("AB");
            builder1.Append("CD");
            builder1.Append("EF");
            string result = builder1.ToString();
            Console.WriteLine(result);

            Console.WriteLine("------------");
            builder1.Clear();
            Console.WriteLine(builder1.ToString());
            /*for(int i = 0; i < 3; i++)
            {
                Console.WriteLine($"请输入第{i+1}个数据:");
                builder1.Append(Console.ReadLine());
            }*/
            Console.WriteLine(builder1.ToString());

            Console.WriteLine("-------------------");
            StringBuilder builder2 = new StringBuilder();
            string teacher = "常老师";
            string month = "3个月";
            builder2.AppendFormat($"主讲老师：{teacher} 课程周期：{month}");
            Console.WriteLine(builder2.ToString());

            Console.WriteLine("-------------------");
            StringBuilder builder3 = new StringBuilder(".net工控上位机和视觉应用发展迅猛");
            builder3.Insert(0, "中国的");
            builder3.Insert(builder3.ToString().Length, "大家加快学习速度");
            Console.WriteLine(builder3.ToString());

            Console.WriteLine("-------------------");
            builder3.Remove(0, builder3.ToString().IndexOf("上"));
            Console.WriteLine(builder3.ToString());
        }
        #endregion
        #region 常见转义字符
        static void Test26()
        {
           /* 常用反斜杠的注义: \
            [1] 使用双反斜杠\\
            [2] 使用@符号
            应用场景：路径、数据库连接字符串或者其他使用单反斜杠的场景
            注意：只是在定义c#“字符串变量”的情况下使用
            在App.config文件中，不需要自己写定义
            */

            //string path = "C:\DB\test.txt"; //会转义
            string path1 = "C:\\DB\\test.txt";
            string path2 = @"C:\db\da\test.txt";
            string connString = "Server=ThingerServer\\SQLEXPRESS;DataBase=smdb;uid=sa;Pwd=123456";
        }
        #endregion

        //数组使用
        #region 数组的基本操作
        static void Test27()
        {
            int[] scores; //[1]声明数组
            scores = new int[5]; //[2]分配空间
            double[] scoreArray = new double[5]; //s实际开发中，可以这样

            //[3]元素赋值
            scores[0] = 67;
            scores[1] = 32;
            scores[2] = 68;
            scores[3] = 9;
            scores[4] = 91;

            //[4]元素操作
            //int avgScor = (scores[0]  + scores[1] + scores[2] + scores[3] + scores[4] + scores[5]) / scores.Length;
            //System.IndexOutOfRangeException:“索引超出了数组界限。”
            int avgScor = (scores[0] + scores[1] + scores[2] + scores[3] + scores[4]) / scores.Length;
            Console.WriteLine(avgScor);


            int[] newScore1 = new int[3] { 67, 68, 69 }; //int[3]方括号决定数组的长度
            int[] newScore2 = new int[] { 67, 68, 69 }; //数组的元素直接决定数组的长度
            int[] newScore3 = { 67, 68, 69 }; //这个是最简单的
        }
        #endregion
        #region 数组的遍历 for forrach
        static void Test28()
        {
            int[] scoreArray = { 44, 21, 56, 7, 89, 24, 6, 88 };
            int sumScore = 0;
            for(int i = 0; i < scoreArray.Length; i++)
            {
                sumScore += scoreArray[i];
            }
            int avgScore = sumScore / scoreArray.Length;
            Console.WriteLine($"for循环得到的学员的平均年龄为：{avgScore}");
            Console.WriteLine("--------------------");
            int[] scoreArray1 = { 44, 21, 56, 7, 89, 24, 6, 88 };
            int sumScore1 = 0;
            //foreach循环语法结构:(元素类型 变量名 in 数组名/集合名)
            foreach(int score in scoreArray1)
            {
                sumScore1 += score;
            }
            int avgScore1 = sumScore1 / scoreArray1.Length;
            Console.WriteLine($"foreach循环得到的学员的平均年龄为：{avgScore1}");
        }
        #endregion
        #region 字符串的分割与拼接、替换
        static void Test29()
        { 
            string data1 = "AB CD EF 00"; //使用空格分割字符串
            string[] stringArray = data1.Split(); //默认用空格分割，然后放到数组中
            string data2 = string.Join("_", stringArray); //字符串重新拼接
            Console.WriteLine( "第一次拼接输出："+data2);
            Console.WriteLine("-----------------------");

            //使用逗号分割，然后用&重新组合
            data1 = "AB,CD,EF,00";
            stringArray = data1.Split(','); //单引号
            data2 = string.Join("&", stringArray);
            Console.WriteLine("第二次拼接输出：" + data2 + "原数个数" + stringArray.Length);

            //字符串替换
            string data3 = data1.Replace(',', '-');
            Console.WriteLine("字符串替换输出：" +data3);

        }
        #endregion
        #region 值类型和引用类型
        static void Test30()
        {
            float tempA = 25.6f;
            float tempB = 22.3f;
            Console.WriteLine("tempA="+ tempA);
            Console.WriteLine("tempB=" + tempB);
            Console.WriteLine("--------------");
            float tempC = tempB;  //传递副本
            tempC += 0.5f;
            Console.WriteLine("tempC=" + tempC);

            // 引用类型变量传递自己，没有开辟空间
            //自己=>变量地址/指针
            Console.WriteLine("--------------");
            float[] tempArray = { 25.6f, 22.3f };
            Console.WriteLine("tempArray[0]=" + tempArray[0]);
            Console.WriteLine("tempArray[1]=" + tempArray[1]);
            float[] tempOther = tempArray; //将数组复制给另一个新的数组  传递自己
            tempOther[1] += 0.5f; 
            Console.WriteLine("tempOther[1]=" + tempOther[1]);

            Console.WriteLine("--------------");
            Console.WriteLine("tempArray[0]=" + tempArray[0]);
            Console.WriteLine("tempArray[1]=" + tempArray[1]);

            //常见的引用类型
            /*[1] string (属于引用类型，但是要当值类型来引用)
            [2] 数组
            [3] 系统库中的各种类
            [4] 自定义的类*/
        }
        #endregion

        //常量枚举
        #region 常量的使用
        static void Test31()
        {
            const double PAI = 3.14;
            //PAI = 3.5; err
            double result = PAI * (5 * 5);
            Console.WriteLine("圆面积=" +result);
        }
        #endregion
        #region 枚举的使用
        static void Test32()
        {
            Gender gender = Gender.Male;
            Console.WriteLine(gender);
            int value = (int)gender;
            Console.WriteLine(value);

            //系统枚举
            DayOfWeek week = DayOfWeek.Sunday;
            switch (week)
            {
                case DayOfWeek.Sunday:
                    Console.WriteLine("今天星期日");
                    break;
                case DayOfWeek.Monday:
                    Console.WriteLine("今天星期1");
                    break;
                case DayOfWeek.Tuesday:
                    Console.WriteLine("今天星期2");
                    break;
                case DayOfWeek.Wednesday:
                    Console.WriteLine("今天星期3");
                    break;
                case DayOfWeek.Thursday:
                    Console.WriteLine("今天星期4");
                    break;
                case DayOfWeek.Friday:
                    Console.WriteLine("今天星期5");
                    break;
                case DayOfWeek.Saturday:
                    Console.WriteLine("今天星期6");
                    break;
                default:
                    break;
            }
        }
        //定义枚举
        #endregion
    }

    #region' 定义枚举
    public enum Gender
    {
        Male = 1,
        Female = 0
    }
    #endregion

}
